package com.xbongbong.pro.service.stage;

import com.xbongbong.paas.domain.entity.PaasStageEntity;
import com.xbongbong.paas.domain.entity.StageProcessEntity;
import com.xbongbong.paas.pojo.StageFindPojo;
import com.xbongbong.paas.toolbox.exception.XbbException;

import java.util.List;
import java.util.Set;

/**
 * 阶段查询相关，只放查询阶段的方法
 * @author zcp
 * @version v1.0
 * @since v1.0
 */
public interface StageFindStrategy {
    /**
     * 业务类型
     * @return
     */
    void register();

    /**
     * 获取当前form启用的版本
     * 如果全部未启用，则获取最后一个创建的版本
     * @param corpid
     * @param formId
     * @return com.xbongbong.paas.domain.entity.StageProcessEntity
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    StageProcessEntity getNowProcess(String corpid, Long formId);
    /**
     * 获取当前启用的流程版本的id
     * 如果全部未启用，则获取最后一个创建的版本
     * @param corpid
     * @param formId 每个form内只有1个enable的版本，代表当前版本
     * @return java.lang.Long
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    Long getNowProcessId(String corpid, Long formId);

    /**
     * 根据formId，code获取阶段
     * @param corpid
     * @param formId
     * @param code
     * @return
     * @throws XbbException
     */
    PaasStageEntity getByCode(String corpid, Long formId, String code);

    /**
     * 获取【特定类型】阶段实体集合
     * @param corpid 公司id
     * @param stageFindPojo 阶段查询pojo 根据StageFindPojo初始化的不同，查询不同条件下的阶段
     * @return java.util.List<com.xbongbong.paas.domain.entity.PaasStageEntity> 阶段实体list
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    List<? extends PaasStageEntity> findStageList(String corpid, StageFindPojo stageFindPojo);

    /**
     * 获取【特定类型】阶段实体集合 - 失败阶段强制放到成功阶段之后，取消阶段置底
     * @param corpid 公司id
     * @param stageFindPojo 阶段查询pojo 根据StageFindPojo初始化的不同，查询不同条件下的阶段
     * @return java.util.List<com.xbongbong.paas.domain.entity.PaasStageEntity> 阶段实体list
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    List<? extends PaasStageEntity> findStageListSpecial(String corpid, StageFindPojo stageFindPojo);

    /**
     * 获取【特定类型】阶段code
     * @param corpid 公司id
     * @param stageFindPojo 阶段查询pojo 根据StageFindPojo初始化的不同，查询不同条件下的阶段
     * @return java.util.Set<java.lang.String>
     * @author zcp
     * @since v1.0
     * @version v1.0
     */
    Set<String> findStageCodeList(String corpid, StageFindPojo stageFindPojo);
}
